package org.xtext.mydsl.validation

import java.util.List
import org.eclipse.xtext.validation.Check
import org.xtext.mydsl.scheduler.Actividad
import org.xtext.mydsl.scheduler.Charla
import org.xtext.mydsl.scheduler.Conferencia
import org.xtext.mydsl.scheduler.Dia
import org.xtext.mydsl.scheduler.MesaDebate
import org.xtext.mydsl.scheduler.Orador
import org.xtext.mydsl.scheduler.SchedulerPackage
import org.xtext.mydsl.scheduler.impl.CharlaImpl
import org.xtext.mydsl.scheduler.impl.MesaDebateImpl
import utils.AgregarHorarioMethods
import utils.EventoConHorario

class ValidacionesOradores extends MyAbstractValidator {
	
	public static val INVALID_NAME = 'invalidName'
	extension AgregarHorarioMethods = new AgregarHorarioMethods

	@Check
	def oradorNoParticipaEnDosActividadesAlMismoTiempo(Dia it){
		val oradores = (eContainer as Conferencia).oradores
		val actividadesConHorarios = eventos.agregarHorarios(inauguracion.horario)
		oradores.forEach[actividadesConHorarios.hayProblemaCon(it)]
	}
	
	def hayProblemaCon(List<EventoConHorario> eventos, Orador orador){
		val eventoDeOrador = eventos.filter[actividad.estaElOrador(orador)]
		if (eventoDeOrador.filter[eventC |  eventoDeOrador.forall[ it.estanAlMismoTiempo(eventC)]].size > 1)
			error("Este orador no puede estar en varias charlas al mismo tiempo", SchedulerPackage.Literals.DIA__EVENTOS, INVALID_NAME)
		else if (eventoDeOrador.filter[eventC |  eventoDeOrador.forall[ it.sonAdyacentes(eventC)]].size > 1)
			warning("Este orador tiene dos actividades adyacentes ", SchedulerPackage.Literals.DIA__EVENTOS, INVALID_NAME)
	}
	
	def estaElOrador(Actividad act, Orador orador){
		switch act {
			case act.class.equals(CharlaImpl) : (act as Charla).oradores.contains(orador)
			case act.class.equals(MesaDebateImpl) : ((act as MesaDebate).ladoA + (act as MesaDebate).ladoB).toList.contains(orador)
			default :  false
		}
	}
	
}